﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpUiViewInterface.h"

#include "IObject.h"
#include "Vector3d.h"
#include "Coordinate3d.h"
#include "Intervald.h"


namespace gcmp
{
    /// \brief 临时尺寸标注的生成数据
    FINAL_INTERFACE class GCMP_UI_VIEW_INTERFACE_EXPORT ITemporaryDimensionContext
    {
    public:
        virtual ~ITemporaryDimensionContext() {}
    public:

        /// \brief 创建线性尺寸标注的生成数据
        /// \param startPt 线性构件起点
        /// \param endPt 线性构件终点
        /// \param enableLengthDimension 是否开启长度标注
        /// \param enableAngleDimension 是否开启角度标注
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateLinearContext(
            const Vector3d& startPt, const Vector3d& endPt,
            bool enableLengthDimension, bool enableAngleDimension, 
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 创建弧形半径尺寸标注的生成数据
        /// \param startPt 弧形构件起点
        /// \param endPt 弧形构件终点
        /// \param refPt 弧形构件弧上一点
        /// \param enableArcFillet 是否开启倒角标注
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateRadiusContext(
            const Vector3d& startPt, const Vector3d& endPt, const Vector3d& refPt,
            bool enableArcFillet,
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 创建弧形圆心起点终点尺寸标注的生成数据
        /// \param centerPt 弧形构件圆心
        /// \param startPt 弧形构件起点
        /// \param endPt 弧形构件终点
        /// \param refPt 弧形构件弧上一点
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateCentralAngleContext(
            const Vector3d& centerPt, const Vector3d& startPt, const Vector3d& endPt, const Vector3d& refPt, 
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 创建旋转尺寸标注的生成数据
        /// \param centerPt 旋转轴心
        /// \param startPt 旋转弧起点
        /// \param endPt 旋转弧终点
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateRotationContext(
            const Vector3d& centerPt, const Vector3d& startPt, const Vector3d& endPt, 
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 创建矩形尺寸标注的生成数据
        /// \param startPt 矩形对角线角点1
        /// \param endPt 矩形对角线角点2
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateRectangleContext(
            const Vector3d& startPt, const Vector3d& endPt,
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 创建三角形尺寸标注的生成数据
        /// \param pt1   三角形角点1
        /// \param pt2   三角形角点2
        /// \param pt3   三角形角点3
        /// \param coord 尺寸标注的坐标系 （默认值为世界坐标系）
        /// \return OwnerPtr<ITemporaryDimensionContext> 创建的数据
        static OwnerPtr<ITemporaryDimensionContext> CreateTriangleContext(
            const Vector3d& pt1, const Vector3d& pt2, const Vector3d& pt3 ,
            const Coordinate3d& coord = Coordinate3d());

        /// \brief 获取长度输入有效范围
        /// \return Intervald 长度输入有效范围
        virtual Intervald GetValidRangeOfLength() const = 0;

        /// \brief 设置长度输入有效范围
        /// \param range 范围
        /// \return bool 若范围不为空，则返回true；否则返回false
        virtual bool SetValidRangeOfLength(const Intervald& range) = 0;

        /// \brief 获取角度输入有效范围
        /// \return Intervald 角度输入有效范围
        virtual Intervald GetValidRangeOfAngle() const = 0;

        /// \brief 设置角度输入有效范围
        /// \param range 范围
        /// \return bool 若范围不为空，则返回true；否则返回false
        virtual bool SetValidRangeOfAngle(const Intervald& range) = 0;

        /// \brief 设置用户自定义输入
        ///
        /// \return  true表示支持自定义输入，false表示不支持
        virtual void SetUserCustomInput(bool userCustom) = 0;

        /// \brief 设置长度精度
        /// \param precision 精度值,默认值2，范围值[0-12],大于12取值12
        virtual void SetLengthPrecision(unsigned int precision) = 0;

        /// \brief 设置角度精度
        /// \param precision 精度值,默认值2，范围值[0-12],大于12取值12
        virtual void SetAnglePrecision(unsigned int precision) = 0;

        /// \brief 设置半径精度
        /// \param precision 精度值,默认值2，范围值[0-12],大于12取值12
        virtual void SetRadiusPrecision(unsigned int precision) = 0;
    };
}



